<html>
<head>
<title>Audio-context</title>
<style>
label input[type=checkbox] { display: none; }
label input[type=checkbox] ~ textarea { display: none; }
label input[type=checkbox] ~ *[type=on] { display: none; }
label input[type=checkbox] ~ *[type=off] { display: inline; border: thin buttonface outset; }
label input[type=checkbox] ~ *[type=off]:hover { color: blue; }
label input[type=checkbox]:checked ~ *[type=off] { display: none; }
label input[type=checkbox]:checked ~ *[type=on] { display: inline; border: thin buttonface inset; }
label input[type=checkbox]:checked ~ *[type=on]:hover { color: blue; }
label input[type=checkbox]:checked ~ textarea { display: block; }
input[type=range] {
	-webkit-appearance: none;/*removes default webkit styles*/
	border: 1px solid white;/*fix for FF unable to apply focus style bug */
	width: 300px;/*required for proper track sizing in FF*/
	height:12px;
}
input[type=range]::-webkit-slider-runnable-track {
	width: 300px;
	height: 5px;
	background: #ddd;
	border: none;
	border-radius: 3px;
}
input[type=range]::-webkit-slider-thumb {
	-webkit-appearance: none;
	border: none;
	height: 10px;
	width: 10px;
	border-radius: 50%;
	background: goldenrod;
	margin-top: -4px;
}
input[type=range]:focus {
	outline: none;
}
input[type=range]:focus::-webkit-slider-runnable-track {
	background: #ccc;
}
input[type=range]::-moz-range-track {
	width: 300px;
	height: 5px;
	background: #ddd;
	border: none;
	border-radius: 3px;
}
input[type=range]::-moz-range-thumb {
	border: none;
	height: 16px;
	width: 16px;
	border-radius: 50%;
	background: goldenrod;
}
input[type=range]:-moz-focusring{/*hide the outline behind the border*/
	outline: 1px solid white;
	outline-offset: -1px;
}
input[type=range]::-ms-track {
	width: 300px;
	height: 5px;
	background: transparent;/*remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead */
	border-color: transparent;/*leave room for the larger thumb to overflow with a transparent border */
	border-width: 6px 0;
	color: transparent;/*remove default tick marks*/
}
input[type=range]::-ms-fill-lower {
	background: #777;
	border-radius: 10px;
}
input[type=range]::-ms-fill-upper {
	background: #ddd;
	border-radius: 10px;
}
input[type=range]::-ms-thumb {
	border: none;
	height: 16px;
	width: 16px;
	border-radius: 50%;
	background: goldenrod;
}
input[type=range]:focus::-ms-fill-lower {
	background: #888;
}
input[type=range]:focus::-ms-fill-upper {
	background: #ccc;
}</style>
<script>
//	2014.01.16 by Alikberov Ruslan
//	http://softrash.googlecode.com/
var
	$0 = 0, $1 = 0, $2 = 0, $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0, $9 = 0,
	$A = 0, $B = 0, $C = 0, $D = 0, $E = 0, $F = 0, $G = 0, $H = 0, $I = 0, $J = 0,
	$K = 0, $L = 0, $M = 0, $N = 0, $O = 0, $P = 0, $Q = 0, $R = 0, $S = 0, $T = 0,
	$U = 0, $V = 0, $W = 0, $X = 0, $Y = 0, $Z = 0,
	$a = 0, $b = 0, $c = 0, $d = 0, $e = 0, $f = 0, $g = 0, $h = 0, $i = 0, $j = 0,
	$k = 0, $l = 0, $m = 0, $n = 0, $o = 0, $p = 0, $q = 0, $r = 0, $s = 0, $t = 0,
	$u = 0, $v = 0, $w = 0, $x = 0, $y = 0, $z = 0,
	$_ = 0, $$_ = 0, $$f = 8000, $$F = 44100, $$d = 0, $$D = 3,
	AudioAPI = false,
	AudioAPIscript = false,
	AudioAPIanalyser = false,
	AudioAPIfilter = false,
	AudioFX = {
		script: "Math.random()",
		log:	"",
		stamp: 0
	},
	amp = [],			//	Amplifiers
	osc = [],			//	Oscillators
	smp = [],			//	Sample
	seq = [{},{},{},{}],//	Sequencer queue
	c2d = 0,			//	Current 2D-graphics context
	cnv = 0,			//	Current canvas object
	AudioContextId = 0,	//	Current audio context identifier
	Logs = [],			//	Logging of warnings and errors
	AudioContextList = {
		cAudioContext		:"Chrome-Audio",
		mozAudioContext		:"Mozilla-Audio",
		msAudioContext		:"Microsoft-Audio",
		oAudioContext		:"Opera-Audio",
		webkitAudioContext	:"WebKit-Audio",
		AudioContext		:"W3C Audio"
	};

function draw() {
    //Get the Sound data
	var	i, n;
    var freqByteData = new Uint8Array(AudioAPIanalyser.frequencyBinCount);
    AudioAPIanalyser.getByteFrequencyData(freqByteData);
    c2d.beginPath();
    c2d.lineWidth = 1.0; 
    c2d.strokeStyle = "rgba(255,255,0,1)";
    c2d.lineStyle = 'rgba(1,1,0,1)';
    c2d.fillStyle = '#0000FF';
    c2d.clearRect(0, 0, cnv.width, cnv.height);
    c2d.fillRect(0, 0, cnv.width, cnv.height);
    c2d.fillStyle = '#007FFF';
	c2d.strokeStyle = "#003FFF";
    c2d.lineCap = 'round';
    c2d.fill();
	n = AudioAPIanalyser.frequencyBinCount;
	i = n;
	c2d.moveTo(cnv.width * -- i / n, cnv.height - 1);
	while(i --) {
		c2d.lineTo(cnv.width * i / n, cnv.height - freqByteData[i] * cnv.height / 256);
	}
	c2d.lineTo(0, cnv.height - 1);
/*    for(i = 0; i < AudioAPIanalyser.frequencyBinCount; i++) {
        c2d.fillRect(i * 640 / AudioAPIanalyser.frequencyBinCount,
        cnv.height, 1, -freqByteData[i / 2] * cnv.height / 256);
    }*/
	c2d.fill();
    c2d.closePath();
    c2d.beginPath();
	c2d.strokeStyle = "#00FFFF";
    AudioAPIanalyser.getByteTimeDomainData(freqByteData);
    c2d.moveTo(0, freqByteData[-- i] * cnv.height / 256);
    for(i = 1; i < AudioAPIanalyser.frequencyBinCount; i++) {
        c2d.lineTo(i, freqByteData[i / 2] * cnv.height / 256);
    }
	c2d.stroke();
    c2d.closePath();
    c2d.beginPath();
	c2d.strokeStyle = "#00FF00";
    c2d.fillStyle = '#FFF';
	c2d.font="20px Courier";
	c2d.font="16px Courier";
	c2d.fontHeight = parseInt(c2d.font);
	i = 1;
	var	n = $_, s = document.getElementById("Val0").value;
	var	val;
	var	txt = "                                                                  ".substr(0, n) + (AudioFX.stamp & 0 ? s.charAt(n) : "_");
	c2d.strokeText(txt, cnv.width - c2d.measureText(s).width, 16 * i);
	c2d.fillText(s.substr(0, n) + (AudioFX.stamp | 0x3 ? s.charAt(n) : "\u2593") + s.substr(n + 1), cnv.width - c2d.measureText(s).width, 16 * i);
	var	w = c2d.measureText("###########");
	w.height = 16;
	while(i < 10) {
		val = eval("$" + i);
		c2d.fillText("$" + i + "=0x" + (0x100 + val).toString(16).substr(1).toUpperCase() + ":" + val, cnv.width - w.width, w.height * (1 + i ++));
	}
	var	w = c2d.measureText("##############");
	w.height = 16;
	c2d.fillText("Filter=" + Math.floor(AudioAPIfilter.frequency.value) + "Hz", cnv.width - w.width, w.height * ++ i);
	c2d.fillText("  Quality=" + Math.floor(AudioAPIfilter.Q.value * 100) / 1 + "%", cnv.width - w.width, w.height * ++ i);
	c2d.fillText("   Volume=" + Math.floor(amp[0].gain.value * 100) / 1 + "%", cnv.width - w.width, w.height * ++ i);
	c2d.font = "10px Courier";
	var	y = w.height;
	var	w = c2d.measureText("#");
	w.height = 10;
	var	v = "0  1 2 3 4 5 6 7 8 9 _ $_ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z".split(" ");
	for(i = 0; i < v.length; ++ i) {
		if(v[i] != "") {
			txt = eval("$" + v[i]);
			if(isFinite(txt))
				txt = Math.floor(txt);
			else
				txt = txt.substr(0, 10);
			c2d.fillText("$" + v[i] + ":" + txt, i % 13 * w.width * 6.5, y + Math.floor(1 + i / 13) * w.height);
		}
	}
	AudioFX.stamp ++;
    c2d.stroke();
	return true;
	//requestAnimationFrame(draw);
}
function AudioCallBack(e) {
	$1 = +document.getElementById("Val1").value,
	$2 = +document.getElementById("Val2").value,
	$3 = +document.getElementById("Val3").value,
	$4 = +document.getElementById("Val4").value,
	$5 = +document.getElementById("Val5").value,
	$6 = +document.getElementById("Val6").value,
	$7 = +document.getElementById("Val7").value,
	$8 = +document.getElementById("Val8").value,
	$9 = +document.getElementById("Val9").value;
	$0 = document.getElementById("Val0").value;
	try {
		var	i;
		var	step = $$f / $$F, curr = 0.0;
		var input = e.inputBuffer.getChannelData(0);
		var output = e.outputBuffer.getChannelData(0);
		var	xpression = AudioFX.script;
		var	evl = (eval(xpression) % 256 - 128) / 128;
		try {
			for(i = 0; i < input.length; ++ i) {
				output[i] = evl;
				curr += step;
				if(curr >= 1.0)
					$$_ ++, curr -= 1.0, evl = (eval(xpression) % 256 - 128) / 128;
			}
		} catch(e) {
			while(i < input.length)
				output[i ++] = (Math.random() % 255 - 128) / 128;
		}
		AudioFX.log = Custom_Value[10];
	} catch (e) {
		window.status = e.message;
	}
	$$d = ($$d + 1) % $$D
	return $$d ? true : draw();
}
function main(e) {
	var	colors = "silver white mistyrose sheashell lightgoldenrodyellow greenyellow lavenderblush lavender gainsboro whitesmoke".split(" ");
	var	c = document.getElementById("Coll");
	var	f = document.getElementById("Fav");
	var	btn = [[], [], [], [], [], [], [], [], [], []];
	for(var i = 0; i < c.options.length; ++ i) {
		c.options[i].title = c.options[i].title.replace(/(.)(.)(.)(..)(.*)/, "$1Video#$2 [$3:$4]\r\nby $5");
		var	n = +c.options[i].title.charAt(0);
		c.options[i].title = (i + 1) + ": " + c.options[i].title.substr(1);
		c.options[i].style.backgroundColor = colors[n];
		c.options[i].innerText = (i + 1) + ": " + c.options[i].innerText;
		if(n >= 7) {
			var	b = document.createElement("button");
			b.title = c.options[i].title;
			b.innerText = i + 1;
			b.addEventListener("click", function(e) {
				var e = document.getElementById("Coll");
				e.options.selectedIndex = +this.innerText - 1;
				e.onchange();
			});
			btn[n].push(b);
		}
	}
	for(var i = btn.length; i --;) {
		for(var j in btn[i])
			f.appendChild(btn[i][j]);
	}
	try {
		AudioAPI = new AudioContext();
	} catch(err) {
	}
	if(cnv = document.getElementsByTagName("canvas")[0]) {
		if(c2d = cnv.getContext("2d"))
			Logs.push("O'Kay: You will using the 2D-graphics");
		else
			Logs.push("ERROR: Sorry, but can't finding 2D-graphics");
	} else
		Logs.push("ERROR: Sorry, but any graphics in unavailable");
	if(!AudioAPI)
		Logs.push("ERROR: Any audio context is unavailable");
	else {
		Logs.push("O'Kay: You will using the AudioContext");
		AudioAPIanalyser = AudioAPI.createAnalyser();
		AudioAPIanalyser.connect(AudioAPI.destination);
		AudioAPIfilter = AudioAPI.createBiquadFilter(); 
		AudioAPIfilter.type = 1; // High-pass filter (Тип фильтра)
		AudioAPIfilter.frequency.value = 96000; // Cutoff to 1kHZ (Базовая частота)
		AudioAPIfilter.frequency.Q = 1.1; // Quality factor (Добротность)
		AudioAPIfilter.connect(AudioAPIanalyser);
		(amp[0] = AudioAPI.createGain()).connect(AudioAPIfilter); /*amp[0].connect(anl)*/; amp[0].gain.value = 1.0;
		if(!AudioAPI.createScriptProcessor)
			AudioAPIscript = AudioAPI.createJavaScriptNode(1 << 10, 1, 1);
		else
			AudioAPIscript = AudioAPI.createScriptProcessor(1 << 10, 1, 1);
		AudioAPIscript.onaudioprocess = AudioCallBack;
		document.getElementById("Calc").onkeypress = function(e) {
			var	evt = e || window.event;
			if(evt.ctrlKey)
				CheckIt();
		};
		// connect the ScriptProcessorNode with the input audio
		//amp[0].connect(AudioAPIscript);
		// if the ScriptProcessorNode is not connected to an output the "onaudioprocess" event is not triggered in chrome
		AudioAPIscript.connect(amp[0]);
		document.getElementById("Logger").value += Logs.join("\r\n");
		var url = window.location.href;
		var	xpression = (match = url.match(/select=([^&]+)/)) ? match[1] : -1;
		if(xpression > 0) {
			var e = document.getElementById("Coll");
			e.options.selectedIndex = +xpression - 1;
			setTimeout("document.getElementById('Coll').onchange()", 1000);
		} else
		if(xpression == 0)
			setTimeout(CheckIt, 1000);
		document.getElementById("Qual").onchange();
		document.getElementById("Vol").onchange();
		document.getElementById("Freq").onchange();
	}
}
function CheckIt() {
	var	xpression = document.getElementById("Calc").value;
	var	i = xpression.indexOf("\r\n");
	if(i < 0)
		i = xpression.indexOf("\n");
	var	parameters = xpression.substr(0, i);
	xpression = xpression.substr(i);
	var	ypression = parameters.indexOf("Hz");
	var	zpression = parseInt(parameters.substr(1, ypression - 1));
	if(parameters.charAt(0) == "#" && ypression > 4) {
		if(zpression < 4000)
			return alert("Bad frequency");
		parameters = parameters.substr(ypression + 2);
		ypression = parameters.indexOf("%");
		if(ypression > 0) {
			if(parseInt(parameters.substr(0, ypression)) > 0)
				document.getElementById("Vol").value = (amp[0].gain.value = parseInt(parameters.substr(0, ypression)) / 100);
			parameters = parameters.substr(ypression + 1);
			parameters = parameters.split(",");
			for(var i in parameters) {
				if(i < 9 && isFinite(parameters[i]))
					document.getElementById("Val" + (+i + 1)).value = parameters[i];
				if(i == 9)
					document.getElementById("Val0").value = parameters[i];
			}
		}
		try {
/*			xpression = xpression.replace(/\r?\n/g, "").replace(/\(@\)/g, "Custom_Value[10]").replace(/\(\@([0-9])\)/g, "Custom_Value[$1]").replace(/\(@[A-Z]\)/g,
				function(mch, ofs, str) {
					return "AudioFX.reg[" + (mch.charCodeAt(2) - 65) + "]";
					return alert(mch + '/' + ofs + '/' + str);
				}
			);*/
			eval(xpression);
			AudioFX.script = xpression;
			$$f = zpression;
			$$_ = 0;
		} catch(e) {
			alert("Bad expression");
		}
	} else
		return alert("Undefined frequency");
}
</script>
</head>
<body onload='main(this)'>
<span id='Fav'></span><br />
<select id="Coll" onchange='document.getElementById("Calc").value=this.options[this.selectedIndex].value.replace(/\s/g, "\r\n"); CheckIt()'>
<option title='41010viznut'   value='#8000Hz33%12,8,63,4 t=$$_,t*((t>>$1|t>>$2)&$3&t>>$4)'>by viznut</option>
<option title='41046tejeer'   value='#8000Hz25%5,8,16 t=$$_,(t*(t>>$1|t>>$2))>>(t>>$3)'>by tejeez</option>
<option title='41123visy'     value='#8000Hz33%9,13,25,6 t=$$_,t*((t>>$1|t>>$2)&$3&t>>$4)'>by visy</option>
<option title='41203tejeer'   value='#8000Hz33%11,8,123,3 t=$$_,t*(t>>$1&t>>$2&$3&t>>$4)'>by tejeez</option>
<option title='31242visy'     value='#8000Hz25%8,15,8,20,19,5,3 t=$$_,(t*(t>>$1*(t>>$2|t>>$3)& ($4|(t>>$5)*$6>>t|t>>$7)))'>by visy</option>
<option title='51256tejeer'   value='#8000Hz25%255,13,12,127,234,8,3,3,14 t=$$_,((-t&4095)*($1&t*(t&t>>$2))>>$3)+ ($4&t*($5&t>>$6&t>>$7)>>($8&t>>$9))'>by tejeez</option>
<option title='41333visy'     value='#8000Hz33%9,8,63,4 t=$$_,t*(t>>((t>>$1|t>>$2))&$3&t>>$4)'>"Space Invanders vs Pong"</option>
<option title='72016viznut'   value='#8000Hz33%6,16,10,11,7 t=$$_,(t>>$1|t|t>>(t>>$2))*$3+((t>>$4)&$5)'>by viznut</option>
<option title='42110pyryp'    value='#8000Hz25%1,4,16,6,69,9 t=$$_,$v=($v>>$1)+($v>>$2)+t* (((t>>$3)|(t>>$4))&($5&(t>>$6)))'>by pyryp</option>
<option title='52145red-'     value='#8000Hz33%9,7,11,9 t=$$_,(t|(t>>$1|t>>$2))*t&(t>>$3|t>>$4)'>by red-</option>
<option title='72215miiro'    value='#8000Hz50%5,7,3,4,10 t=$$_,t*$1&(t>>$2)|t*$3&(t*$4>>$5)'>by miiro</option>
<option title='72231viznut'   value='#8000Hz33%7,6,10,4,13,6 t=$$_,(t>>$1|t|t>>$2)*$3+$4*(t&t>>$5|t>>$6)'>by combining findings of xpansive & varjohukka(a)povet.net</option>
<option title='72311shurk'    value='#8000Hz50%255,4,1,3,2 t=($$_&=32767),((t&4096)?((t*(t^t%$1)|(t>>$2))>>$3): (t>>$4)|((t&8192)?t<<$5:t))'>this is raers's version that eliminates the trigonometry</option>
<option title='62328xpansive' value='#8000Hz100%8,9,46,8,13,6 t=$$_,((t*(t>>$1|t>>$2)&$3&t>>$4))^ (t&t>>$5|t>>$6)'>"Lost in Space"</option>
<option title='83010viznut'   value='#11025Hz50%5,7,3,10 t=$$_,(t*$1&t>>$2)|(t*$3&t>>$4)'>from viznut</option>
<option title='73044bat'      value='#8000Hz100%127,4,5,127,16 t=$$_,(t/1e7*t*t+t)%$1 |t>>$2|t>>$3|t%$4+(t>>$5)|t'>from bst</option>
<option title='53103kb'       value='#44100Hz25%2,15,8,28,2,11,12,16,24 t=$$_,((t/$1*($2&(0x234568A0>>(t>>$3&$4)))) |t/$5>>(t>>$6)^t>>$7)+(t/$8&t&$9)'>from kb</option>
<option title='73132viznut'   value='#8000Hz100%255,3,13,6 t=$$_,(t&t%$1)-(t*$2&t>>$3&t>>$4)'>by viznut</option>
<option title='73222droid'    value='#8000Hz100%4,5,7,15,7,15 t=($$_&=262143),t>>$1|t&(t>>$2) /(t>>$3-(t>>$4)&-t>>$5-(t>>$6))'>In C. guard against divide-by-zero</option>
<option title='83257ryg'      value='#44100Hz50%13,7,15,12,128,2,11,4,127,36364689 t=$$_,((t*($0[$_=t>>$1&$2]&$3))/$4&$5) +(((((t>>$4)^(t>>$4)-$6)%$7*t)/$8 |t>>$1)&$9)'>36464689</option>
<option title='73326stepth'   value='#8000Hz50%9,4,5,7,3,1 t=$$_,(t*$1&t>>$2|t*$3&t>>$4|t*$5&t/1024)-$6'>Percussion (-1) added by viznut</option>
<option title='53404viznut'   value='#8000Hz25% t=$$_,((t*(t>>12)&(201*t/100)&(199*t/100)) &(t*(t>>14)&(t*301/100)&(t*399/100))) +((t*(t>>16)&(t*202/100)&(t*198/100)) -(t*(t>>17)&(t*302/100)&(t*298/100)))'>"Dante's Inferno" (by modifying oasiz's formula)</option>
<option title='93515mu6k'     value='#8000Hz100%9,32,14,3,15,4,7,5,14,IQNNNN!!]]!Q!IW]WQNN??!!W]WQNNN? t=$$_,w=t>>$1,k=$2,m=2048,a=1-t/m%1,d=($3*t*t ^t)%m*a,y=[3,3,4,7,2][p=w/k&$4]*t/4,h= $0.charCodeAt($_=w/2&$5|p/3<<$6)/33*t-t,s=y* .98%80+y%80+(w>>$7&&a*(($8*t%m*a&128)*( 0x53232323>>w/4&1)+(d&127)*(0xa444c444 >>w/4&1)*1.5+(d*w&1)+(h%k+h*1.99%k+h*.49%k+h*.97%k-64)*(4-a-a))),s*s>>$9?127:s&127'>Covers "Chaos Theory" by ConsPiracy (Optimized by ryg, p01 et al.)</option>
<option title='13545216'      value='#8000Hz20%15,1,10 t=$$_,t*(t^t+(t>>$1|$2)^(t-1280^t)>>$3)'>3#[5:45] from 216</option>
<option title='93634mu6k'     value='#32000Hz100%1,35,16,24,127,8,10,14,63,6689 t=$$_,(3e3/(y=t&16383)&$1)*$2 +(x=t*$0[$_=(t>>$3)%$0.length]/$4&$5)*y/4e4 +((t>>$6^t>>$7|t>>$8|x)&$9)'>(Optimized by ryg: 32 kHz)</option>
</select><br />
<table><tr><td colspan=2><textarea id='Calc' type='text' cols='132' rows='7' title='Press ctrl+enter for test'>#8363Hz100%5,32,224,,,,,,,-->"Hello World!": is binary message for Aliens in Internet Space!
t=$$_,
d=$0,$_=(c=(t%=(e=d.length?d.length<<4:1)*$1)/$1)>>4,
b=d.charCodeAt(c>>4)>>(7^(c>>1&7)),
(c^b)&1?$2:$3</textarea></td></tr>
<tr><td><canvas width='640' height='480'></canvas></td>
<td style='vertical-align:top; font:8px "Courier";'>
<input id='Val0' type='text' size='38' value='Test Text' /><br />
<input id='Val1' type='range' min='0' max='255' step='1' value='' /><br />
<input id='Val2' type='range' min='0' max='255' step='1' value='' /><br />
<input id='Val3' type='range' min='0' max='255' step='1' value='' /><br />
<input id='Val4' type='range' min='0' max='255' step='1' value='' /><br />
<input id='Val5' type='range' min='0' max='255' step='1' value='' /><br />
<input id='Val6' type='range' min='0' max='255' step='1' value='' /><br />
<input id='Val7' type='range' min='0' max='255' step='1' value='' /><br />
<input id='Val8' type='range' min='0' max='255' step='1' value='' /><br />
<input id='Val9' type='range' min='0' max='255' step='1' value='' /><br />
<input id='Freq' type='range' min='100' max='96000' step='1' value='48000' onchange='AudioAPIfilter.frequency.value = this.value' /><br />
<input id='Qual' type='range' min='0.0' max='1.0' step='0.01' value='0.5' onchange='AudioAPIfilter.Q.value = this.value' /><br />
<input id='Vol' type='range' min='0.0' max='1.0' step='0.01' value='0.5' onchange='amp[0].gain.value = this.value' /></td></tr></table><br />
<label for='LogOn'><input id='LogOn'type='checkbox' /><span type='On'>Hide Log</span><span type='Off'>Show Log</span>
<textarea id='Logger'rows='12'cols='80'></textarea></label>
<div style='text-align: center'><a href='http://countercomplex.blogspot.com/2011/10/algorithmic-symphonies-from-one-line-of.html'>(C) BlogSpot</a></div>
</body>